package club.zhilin.guli.service.edu.service;

import club.zhilin.guli.common.base.result.CommonResult;
import club.zhilin.guli.service.base.dto.CourseDTO;
import club.zhilin.guli.service.edu.domain.Course;
import club.zhilin.guli.service.edu.domain.qo.CourseQueryObject;
import club.zhilin.guli.service.edu.domain.qo.PortalCourseQueryObject;
import club.zhilin.guli.service.edu.domain.vo.CourseRelation;
import club.zhilin.guli.service.edu.domain.vo.CourseVO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 课程 服务类
 * </p>
 *
 * @author zhilin
 * @since 2022-01-11 15:29:01
 */
public interface ICourseService extends IService<Course> {

    /**
     * 保存课程
     *
     * @param courseVO 封装后的课程对象
     * @return id
     */
    String saveCourse(CourseVO courseVO);

    /**
     * 通过课程id查询课程
     *
     * @param id 课程id
     * @return result
     */
    CommonResult<CourseVO> selectCourseById(String id);

    /**
     * 更新
     *
     * @param courseVO courseValueObject
     * @return result
     */
    CommonResult<String> updateCourseVo(CourseVO courseVO);

    /**
     * 根据条件查询对象
     *
     * @param page              页码
     * @param limit             当前页显示数量
     * @param courseQueryObject 查询对象
     * @return result
     */
    CommonResult<Map<String, Object>> selectList(Long page, Long limit, CourseQueryObject courseQueryObject);

    /**
     * 根据id删除课程封面
     *
     * @param id id
     * @return boolean
     */
    boolean removeCoverById(String id);

    /**
     * 通过课程id删除课程及课程相关表
     *
     * @param id 课程id
     * @return boolean
     */
    boolean removeCoverByCourseId(String id);

    /**
     * 根据条件查询课程列表
     *
     * @param portalCourseQueryObject 条件
     * @return list
     */
    List<Course> selectListByCondition(PortalCourseQueryObject portalCourseQueryObject);

    /**
     * 根据课程id查询相应信息
     *
     * @param courseId 课程id
     * @return courseRelation
     */
    CourseRelation selectCourseRelation(String courseId);

    /**
     * 查询热门课程
     *
     * @return list
     */
    List<Course> selectHotCourse();

    /**
     * 根据课程id查询courseDTO
     *
     * @param courseId 课程id
     * @return commonResult
     */
    CourseDTO selectCourseDTO(String courseId);

    /**
     * 通过课程id修改课程购买数量
     *
     * @param courseId 课程id
     */
    void updateBuyCountByCourseId(String courseId);

    /**
     * 通过日期查询指定日期发布课程数量
     *
     * @param date 日期
     * @return integer
     */
    Integer selectCoursePublishCount(String date);
}
